package cn.iocoder.yudao.module.digital.service.cardkeysecret;

import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.digital.controller.admin.cardkeyproduct.vo.CardKeyProductImportExcelVO;
import cn.iocoder.yudao.module.digital.controller.admin.cardkeysecret.vo.*;
import cn.iocoder.yudao.module.digital.dal.dataobject.cardkeysecret.CardkeySecretDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.digital.enums.cardkeysecret.CardKeySourceEnum;
import cn.iocoder.yudao.module.digital.enums.cardkeysecret.ClaimStatusEnum;

/**
 * 卡密密钥 Service 接口
 *
 * @author 超管
 */
public interface CardkeySecretService {

    /**
     * 创建卡密密钥
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createCardkeySecret(@Valid CardkeySecretSaveReqVO createReqVO);

    /**
     * 更新卡密密钥
     *
     * @param updateReqVO 更新信息
     */
    void updateCardkeySecret(@Valid CardkeySecretSaveReqVO updateReqVO);

    /**
     * 获得卡密密钥
     *
     * @param id 编号
     * @return 卡密密钥
     */
    CardkeySecretDO getCardkeySecret(String id);

    /**
     * 获得卡密密钥分页
     *
     * @param pageReqVO 分页查询
     * @return 卡密密钥分页
     */
    PageResult<CardkeySecretDO> getCardkeySecretPage(CardkeySecretPageReqVO pageReqVO);

    /**
     * 查询卡密
     *
     * @param claimStatusEnum 领取状态
     * @param productNo       卡密商品编号
     * @param limitSize       查询的数量
     * @return
     */
    List<CardkeySecretDO> getCardKeySecretByProductNoAndClaimStatus(ClaimStatusEnum claimStatusEnum, String productNo, Integer denomination, int limitSize);

    long countCardKeySecretByProductNo(ClaimStatusEnum claimStatusEnum, String productNo, Integer denomination);

    /**
     * 扣减密钥
     *
     * @param userId
     * @param orderNo
     * @param secretIds
     */
    void deductionSecret(Long userId, String orderNo, Collection<String> secretIds);

    /**
     * 写卡密密钥数据
     * @param list
     */
    void batchCreateCardKeySecret(CardKeySourceEnum source, List<CardKeyProductImportExcelVO> list);

    /**
     * 查询已经领取的卡密
     * @param orderNo
     * @return
     */
    List<CardkeySecretDO> getCardKeySecretByOrderNo(String orderNo);

    /**
     * 查询已经领取的卡密
     * @param orderNo
     * @return
     */
    List<CardkeySecretDO> getCardKeySecretByOrderNo(Long userId, String orderNo);

    CardkeySecretDO getCardKeySecretByNumberCodePin(ClaimStatusEnum claimStatusEnum, String cardNumber, String code, String pin);

    Long getStock(String productNo);

    List<CardkeySecretDO> getByCardKeySecret(String cardKeySecret);
}